package utils

import (
	"log"
	"os/exec"
	"pids-cloud-server/logging"
	"runtime"
	"strconv"
	"time"

	probing "github.com/prometheus-community/pro-bing"
)

func PING(ipAddr string, tryTimes ...int) bool {
	start := time.Now()
	// 如果 tryTimes 未传，设置默认值为 1
	attempts := 2
	if len(tryTimes) > 0 {
		attempts = tryTimes[0] // 取传递的第一个值
	}
	for i := 0; i < attempts; i++ {
		pinger, err := probing.NewPinger(ipAddr)
		if err != nil {
			logging.Error("NewPinger error:", err.Error())
			return false // 这里可以直接返回 false
		}
		// 设置成特权模式
		pinger.SetPrivileged(true)
		if i == 0 {
			// 设置ping包数量
			pinger.Count = 1
			// 设置超时时间
			pinger.Timeout = time.Second * 1
		} else {
			//第二次尝试，调整超时时间
			pinger.Timeout = time.Second * 3
			pinger.Count = 4
		}
		err = pinger.Run()
		if err != nil {
			logging.Error(ipAddr, "ping异常：", err.Error())
			continue // 这里可以继续尝试
		}
		stats := pinger.Statistics()
		// 如果回包大于等于1则判为ping通
		if stats.PacketsRecv >= 1 {
			logging.Debug(ipAddr, "ping耗时：", time.Since(start))
			return true
		} else {
			logging.Error("第", i+1, "次尝试", "IP can not reach:", ipAddr)
		}
	}
	logging.Debug(ipAddr, "ping耗时：", time.Since(start))

	return false
}

// 耗时更短,但是不支持并发
func Ping(ipAddress string) bool {
	start := time.Now()
	var cmd *exec.Cmd
	pingTimes := 1
	timeOut := 2
	if runtime.GOOS == "windows" {
		// Windows 系统的 ping 命令
		// -n 表示发送 pingTimes 次，-w 表示超时时间（毫秒）
		cmd = exec.Command("cmd", "/C", "ping", "-n", strconv.Itoa(pingTimes), ipAddress, "-w", strconv.Itoa(timeOut*1000))
	} else {
		// Unix 系统的 ping 命令
		// -c 表示发送 pingTimes 次，-W 表示超时时间（秒）
		cmd = exec.Command("ping", "-c", strconv.Itoa(pingTimes), ipAddress, "-W", strconv.Itoa(timeOut))
	}

	// 执行命令并等待完成
	err := cmd.Run()
	logging.Debug(ipAddress, "ping耗时：", time.Since(start))
	if err != nil {
		log.Println(ipAddress, "Ping failed:", err)
		return false
	}
	return true
}
